/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VentanaPrincipal.java
 *
 * Created on 16/10/2012, 07:32:37 AM
 */
package administracionDeMemoria;

import java.awt.Color;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

/**
 *
 * @author DS
 */
public class VentanaPrincipal extends javax.swing.JFrame implements Runnable
{

  /**
   * Creates new form VentanaPrincipal
   */
  public VentanaPrincipal()
  {
    initComponents();
    DefaultTreeCellRenderer render = (DefaultTreeCellRenderer) jTree1.getCellRenderer();
    ImageIcon carpeta1 = new ImageIcon(getClass().getResource("/imagenes/carpeta.png"));
    ImageIcon carpeta2 = new ImageIcon(getClass().getResource("/imagenes/carpeta2.png"));
    ImageIcon archivo = new ImageIcon(getClass().getResource("/imagenes/archivo.png"));
    render.setLeafIcon(archivo);
    render.setOpenIcon(carpeta2);
    render.setClosedIcon(carpeta1);
    jTree1.setCellRenderer(render);

  }

  /**
   * This method is called from within the constructor to initialize the form.
   * WARNING: Do NOT modify this code. The content of this method is always
   * regenerated by the Form Editor.
   */
  @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        popupTree = new javax.swing.JPopupMenu();
        mnitAgregarCarpeta = new javax.swing.JMenuItem();
        mnitCrearArchivo = new javax.swing.JMenuItem();
        mnitEliminar = new javax.swing.JMenuItem();
        mnitDesfragmentar = new javax.swing.JMenuItem();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTree1 = new javax.swing.JTree();
        pnlMemoria1 = new administracionDeMemoria.PnlMemoria();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        mntmCrearDD = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();

        mnitAgregarCarpeta.setText("Crear carpeta");
        mnitAgregarCarpeta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnitAgregarCarpetaActionPerformed(evt);
            }
        });
        popupTree.add(mnitAgregarCarpeta);

        mnitCrearArchivo.setText("Crear archivo");
        mnitCrearArchivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnitCrearArchivoActionPerformed(evt);
            }
        });
        popupTree.add(mnitCrearArchivo);

        mnitEliminar.setText("Eliminar");
        mnitEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnitEliminarActionPerformed(evt);
            }
        });
        popupTree.add(mnitEliminar);

        mnitDesfragmentar.setText("Desfragmentar DD");
        mnitDesfragmentar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnitDesfragmentarActionPerformed(evt);
            }
        });
        popupTree.add(mnitDesfragmentar);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(204, 255, 255));

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("No hay ningun disco");
        jTree1.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        jTree1.setComponentPopupMenu(popupTree);
        jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTree1ValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jTree1);
        jTree1.getSelectionModel().setSelectionMode(javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 192, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 378, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout pnlMemoria1Layout = new javax.swing.GroupLayout(pnlMemoria1);
        pnlMemoria1.setLayout(pnlMemoria1Layout);
        pnlMemoria1Layout.setHorizontalGroup(
            pnlMemoria1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 615, Short.MAX_VALUE)
        );
        pnlMemoria1Layout.setVerticalGroup(
            pnlMemoria1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 378, Short.MAX_VALUE)
        );

        jMenu1.setText("File");

        mntmCrearDD.setText("Nuevo DiscoDuro");
        mntmCrearDD.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mntmCrearDDActionPerformed(evt);
            }
        });
        jMenu1.add(mntmCrearDD);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Edit");
        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnlMemoria1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(pnlMemoria1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

  private void mntmCrearDDActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_mntmCrearDDActionPerformed
  {//GEN-HEADEREND:event_mntmCrearDDActionPerformed
    VentanaParametrosDiscoDuro venPaDD = new VentanaParametrosDiscoDuro(this, rootPaneCheckingEnabled);
    venPaDD.setVisible(true);

    System.out.print(venPaDD.getArregloDisco().get(0).getCantidadBloques());
    DefaultMutableTreeNode top = new DefaultMutableTreeNode(
            venPaDD.getArregloDisco().get(0));
    DefaultTreeModel modelo = new DefaultTreeModel(top);
    jTree1.setModel(modelo);
    jTree1.getSelectionModel().setSelectionMode(
            javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION);
    pnlMemoria1.pintar((double)venPaDD.getArregloDisco().get(0).getCantidadBloques());
    pnlMemoria1.repaint();
    
    
   
  }//GEN-LAST:event_mntmCrearDDActionPerformed

  private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt)//GEN-FIRST:event_jTree1ValueChanged
  {//GEN-HEADEREND:event_jTree1ValueChanged
    /*
    DefaultMutableTreeNode nodoSeleccionado =
            (DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent();
    if (nodoSeleccionado.isRoot() || (nodoSeleccionado == null)
            || !(nodoSeleccionado.isLeaf()))
    {
      return;
    }
    String nodoAlumno = nodoSeleccionado.getUserObject().toString();
    javax.swing.JOptionPane.showMessageDialog(null, nodoAlumno);
    * */
  }//GEN-LAST:event_jTree1ValueChanged

  private void mnitAgregarCarpetaActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_mnitAgregarCarpetaActionPerformed
  {//GEN-HEADEREND:event_mnitAgregarCarpetaActionPerformed
    
    
    TreePath rutaPadre = jTree1.getSelectionPath();
    if (rutaPadre == null)
    {
      return;//cuando no hay nodos seleccionados
    }
    DefaultMutableTreeNode nodoPadre = (DefaultMutableTreeNode) rutaPadre.getLastPathComponent();
    if(nodoPadre.getUserObject()instanceof Archivo)
    {
      JOptionPane.showMessageDialog(this, "El elemento seleccionado es un archivo,\n"
              + "no puedes extender mas el arbol.");
      return;
    }
    String nombreCarpeta = JOptionPane.showInputDialog("Nombre de la carpeta");
    Carpeta carpeta = new Carpeta(nombreCarpeta);
    DefaultMutableTreeNode nodoHijo = new DefaultMutableTreeNode(carpeta);
    DefaultTreeModel modeloArbol = (DefaultTreeModel) jTree1.getModel();
    modeloArbol.insertNodeInto(nodoHijo, nodoPadre,nodoPadre.getChildCount());
    jTree1.scrollPathToVisible(new TreePath(nodoHijo.getPath()));
  }//GEN-LAST:event_mnitAgregarCarpetaActionPerformed

  private void mnitCrearArchivoActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_mnitCrearArchivoActionPerformed
  {//GEN-HEADEREND:event_mnitCrearArchivoActionPerformed
    
    TreePath rutaPadre = jTree1.getSelectionPath();
    if (rutaPadre == null)
    {
      JOptionPane.showMessageDialog(this, "Selecciona un elemento");
      return;//cuando no hay nodos seleccionados
    }
    DefaultMutableTreeNode nodoPadre = (DefaultMutableTreeNode) rutaPadre.getLastPathComponent();
    if(nodoPadre.getUserObject()instanceof Archivo)
    {
      JOptionPane.showMessageDialog(this, "El elemento seleccionado es un archivo,\n"
              + "no puedes extender mas el arbol.");
      return;
    }
    String nombreArchivo = JOptionPane.showInputDialog("Nombre del archivo");
    int size = Integer.valueOf(JOptionPane.showInputDialog("Tamaño del archivo"));
    
    Archivo archivo = new Archivo(nombreArchivo, size);
    
    if(pnlMemoria1.rellenar(archivo.getColor(),archivo.getSize()))
    {
      pnlMemoria1.repaint();
      
      DefaultMutableTreeNode nodoHijo = new DefaultMutableTreeNode(archivo);
      DefaultTreeModel modeloArbol = (DefaultTreeModel) jTree1.getModel();
      modeloArbol.insertNodeInto(nodoHijo, nodoPadre,nodoPadre.getChildCount());
      jTree1.scrollPathToVisible(new TreePath(nodoHijo.getPath()));
    }else
    {
      JOptionPane.showMessageDialog(this, "Memoria llena");
    }
    
    
    
    
  }//GEN-LAST:event_mnitCrearArchivoActionPerformed

  private void mnitEliminarActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_mnitEliminarActionPerformed
  {//GEN-HEADEREND:event_mnitEliminarActionPerformed
    TreePath rutaNodoSeleccionado = jTree1.getSelectionPath();
    if (rutaNodoSeleccionado == null)
    {
      return;
    }
    DefaultMutableTreeNode nodoSeleccionado = (DefaultMutableTreeNode) rutaNodoSeleccionado.getLastPathComponent();
    if (nodoSeleccionado.isRoot())
    {
      return;
    }
    DefaultTreeModel modeloArbol = (DefaultTreeModel) jTree1.getModel();
    if(nodoSeleccionado.getUserObject() instanceof Archivo ) 
    {
        pnlMemoria1.borrarBloque(((Archivo)nodoSeleccionado.getUserObject()).getColor());
    }else if(nodoSeleccionado.getUserObject() instanceof Carpeta ) 
    {
        int opcion = JOptionPane.showConfirmDialog(this, "La carpeta puede contener archivos,"
                + " si la borra podria perder los mismos. Continuar?");
        if(opcion != 0)
        {
            return;
        }else
        {
          if(nodoSeleccionado.getChildCount() > 0)
          {
            recorrerCarpeta(nodoSeleccionado);
          }
        }
        
    }
    modeloArbol.removeNodeFromParent(nodoSeleccionado);
    pnlMemoria1.repaint();
    
  }//GEN-LAST:event_mnitEliminarActionPerformed

private void mnitDesfragmentarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnitDesfragmentarActionPerformed
                                                    
    TreePath rutaNodoSeleccionado = jTree1.getSelectionPath();
    if (rutaNodoSeleccionado == null)
    {
      return;
    }
    DefaultMutableTreeNode nodoSeleccionado = (DefaultMutableTreeNode) rutaNodoSeleccionado.getLastPathComponent();
    if (!nodoSeleccionado.isRoot())
    {
      JOptionPane.showMessageDialog(this, "Selecciona un Disco Duro");
      return;
    }
    Thread hiloDeszfragmentador = new Thread(this);
    hiloDeszfragmentador.start();
    
   // Desfragmnetador des = new Desfragmnetador();
    //des.setPnlMem(pnlMemoria1);
    //des.start();
}//GEN-LAST:event_mnitDesfragmentarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTree jTree1;
    private javax.swing.JMenuItem mnitAgregarCarpeta;
    private javax.swing.JMenuItem mnitCrearArchivo;
    private javax.swing.JMenuItem mnitDesfragmentar;
    private javax.swing.JMenuItem mnitEliminar;
    private javax.swing.JMenuItem mntmCrearDD;
    private administracionDeMemoria.PnlMemoria pnlMemoria1;
    private javax.swing.JPopupMenu popupTree;
    // End of variables declaration//GEN-END:variables
    
    @Override
    public void run()
    {
      do
      {
         try
        {
          Thread.sleep(2000);
        } catch (InterruptedException ex)
        {
          Logger.getLogger(VentanaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        }
      pnlMemoria1.desfragmentar();
      
      pnlMemoria1.repaint();
       
        System.out.println(pnlMemoria1.flagDesf);
      
      }while(pnlMemoria1.flagDesf == false);
    }
    public void recorrerCarpeta(DefaultMutableTreeNode nodoSeleccionado)
    {
      int numerohijos = nodoSeleccionado.getChildCount();
      for (int i = 0; i < nodoSeleccionado.getChildCount(); i++ )
      {
        System.out.println(numerohijos);
        System.out.println(((DefaultMutableTreeNode)nodoSeleccionado.getChildAt(i)).
                getUserObject() instanceof Carpeta);
        
        if(((DefaultMutableTreeNode)nodoSeleccionado.getChildAt(i)).
                getUserObject() instanceof Carpeta)
        {
          recorrerCarpeta((DefaultMutableTreeNode)nodoSeleccionado.getChildAt(i));
        }else
        {
          pnlMemoria1.borrarBloque(((Archivo)((DefaultMutableTreeNode)nodoSeleccionado.getChildAt(i)).
                getUserObject()).getColor()); 
        }
        
        
        
      }
    }
    
}
